package com.redis.springtest;

import com.redis.springtest.config.RedisConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;

import java.util.List;

public class TransactionTest1 {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(RedisConfig.class);
        final RedisTemplate redisTemplate = ctx.getBean(RedisTemplate.class);

        SessionCallback callback = new SessionCallback() {
            @Override
            public String execute(RedisOperations ops) throws DataAccessException {
                ops.multi();
                ops.boundValueOps("key1").set("value1");
                // 注意由于命令只是进入队列，而没有被执行，所以此处采用get命令，而value会返回为null
                String value = (String) ops.boundValueOps("key1").get();
                System.out.println("事务执行过程中，命令如队列，而没有被执行，所以value为空，value=" + value);
                // 此时list会保存之前进入队列所有命令的结果
                List exec = ops.exec();
                // 事务结束后，获取value1
                String key1 = (String) redisTemplate.opsForValue().get("key1");
                return key1;
            }
        };

        // 执行redis命令
        Object execute = redisTemplate.execute(callback);
        System.out.println(execute);

    }
}
